package com.proba.annotations.hibernate;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.proba.annotations.GotovProizvodDAO;
import com.proba.annotations.pojo.EdinicaMerka;
import com.proba.annotations.pojo.GotovProizvod;

@Repository
public class GotovProizvodHibernateDAO extends
		AbstractHibernateDAO<GotovProizvod, Long> implements
		GotovProizvodDAO {

	@Override
	public List<GotovProizvod> findByGotovProizvod(String gotovProizvod) {
		return findByCriteria(Restrictions.eq("gotovProizvod", gotovProizvod));
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public List<GotovProizvod> findByTipGotovProizvod(String tipGotovProizvod) {
		return getCriteria().createCriteria("tipGotovProizvod").add(Restrictions.eq("tipGotovProizvod", tipGotovProizvod)).list();
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public List<GotovProizvod> findByEdinicaMerka(int startIndex, int pageSize, Long edinicaMerka) {
		Criteria paged = getCriteria(startIndex, pageSize);
		Criteria crit = getFindByEdinicaMerkaCriteria(paged, edinicaMerka);
		return crit.list();
	}
	
	@Override
	public Integer countByEdinicaMerka(Long edinicaMerka) {
		Criteria crit = getFindByEdinicaMerkaCriteria(getCriteria(), edinicaMerka);
		return count(crit);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public List<GotovProizvod> findByFilterParams(int startIndex, int pageSize,
			Long id, String edinicaMerka, String gotovProizvod,
			String tipGotovProizvod) {
		Criteria crit = getCriteria(startIndex, pageSize);
		if (id != null) {
			crit.add(Restrictions.eq("id", id));
		}
		if (edinicaMerka != null && !edinicaMerka.isEmpty()) {
			crit.createCriteria("edinicaMerka").add(like("edinicaMerka", edinicaMerka));
		}
		if (gotovProizvod != null && !gotovProizvod.isEmpty()) {
			crit.add(like("gotovProizvod", gotovProizvod));
		}
		if (tipGotovProizvod != null && !tipGotovProizvod.isEmpty()) {
			crit.createCriteria("tipGotovProizvod").add(like("tipGotovProizvod", tipGotovProizvod));
		}
		return crit.list();
	}
	
	private Criteria getFindByEdinicaMerkaCriteria(Criteria crit, Long edinicaMerka) {
		return crit.createCriteria("edinicaMerka").add(Restrictions.eq("id", edinicaMerka));
	}
	
}
